# coding=utf-8

# 创建一个类
# class Student:#Student为类名，类名可以由一个或者多个单词组成，每个单词首字母大写，其余小写
#     pass
# print(id(Student))#Student也是对象，有地址，有数据类型，有值
# print(type(Student))
# print(Student)


class Student:
    # 类属性
    native_pace = '北京'  # 直接写在类里的属性，称为类属性

    def __init__(self, name, age):  # init初始化
        self.name = name
        self.age = age

    # 实例方法
    def eat(self):  # 默认方法为自身
        print('吃饭...')

    # 静态方法
    @staticmethod
    def method():  # 括号里没有对象，说明没有默认方法
        print('我在使用静态方法')

    # 类方法
    @classmethod
    def cm(cls):  # 默认方法为cls（类）
        print('hello world')


"""根据类对象创建出来的就是实例对象"""
stu = Student('张三', 22)  # 实例对象中有指针指向类对象，告诉我们指定的类对象是哪个
print(stu)
print(id(stu))  # id的十六进制表示就是print（stu）的结果
print(type(stu))

"""对类中方法的调用的两种方式"""
stu.eat()  # 对象名.方法名（）
Student.eat(stu)  # 类名.方法名（类的对象），这里的类的对象指的实际是方法定义中的self

"""对类属性的调用"""
stu1 = Student('李四', 34)
# 依然是两种方法
print('-------------------------------------------------')
print(Student.native_pace)
print(stu.native_pace)
print(stu1.native_pace)
stu.native_pace = '杭州'
print(Student.native_pace)  # 通过实例对象修改，并不能改变类属性的实际值，所以此时类属性仍然输出为北京
print(stu.native_pace)
print(stu1.native_pace)

# 但是这个时候通过Student修改类属性里的值
# Student本身和stu1都改变，但是因为stu对于native_pace已作出自身修改所以不随Student改变而改变
Student.native_pace = '四川'
print(Student.native_pace)
print(stu.native_pace)
print(stu1.native_pace)

"""类方法的使用方式"""
print('----------------------类方法-----------------------------')
Student.cm()
print('----------------------静态方法-----------------------------')
Student.method()